
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta charset="utf-8" />
    <title>point_defect_static calculation style &#8212; iprPy 0.10.2 documentation</title>
    <link rel="stylesheet" href="../_static/basic.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <script type="text/javascript" src="../_static/language_data.js"></script>
    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
    <script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
    <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true, "ignoreClass": "document", "processClass": "math|output_area"}})</script>
    <link rel="index" title="Index" href="../genindex.html" />
    <link rel="search" title="Search" href="../search.html" />
    <link rel="next" title="relax_box calculation style" href="relax_box.html" />
    <link rel="prev" title="point_defect_diffusion calculation style" href="point_defect_diffusion.html" /> 
  </head><body>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="right" >
          <a href="relax_box.html" title="relax_box calculation style"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="point_defect_diffusion.html" title="point_defect_diffusion calculation style"
             accesskey="P">previous</a> |</li>
        <li class="nav-item nav-item-0"><a href="../index.html">iprPy 0.10.2 documentation</a> &#187;</li>
          <li class="nav-item nav-item-1"><a href="../notebook_styles.html" accesskey="U">Jupyter Demonstration Notebooks</a> &#187;</li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  
<style>
/* CSS for nbsphinx extension */

/* remove conflicting styling from Sphinx themes */
div.nbinput.container,
div.nbinput.container div.prompt,
div.nbinput.container div.input_area,
div.nbinput.container div[class*=highlight],
div.nbinput.container div[class*=highlight] pre,
div.nboutput.container,
div.nboutput.container div.prompt,
div.nboutput.container div.output_area,
div.nboutput.container div[class*=highlight],
div.nboutput.container div[class*=highlight] pre {
    background: none;
    border: none;
    padding: 0 0;
    margin: 0;
    box-shadow: none;
}

/* avoid gaps between output lines */
div.nboutput.container div[class*=highlight] pre {
    line-height: normal;
}

/* input/output containers */
div.nbinput.container,
div.nboutput.container {
    display: -webkit-flex;
    display: flex;
    align-items: flex-start;
    margin: 0;
    width: 100%;
}
@media (max-width: 540px) {
    div.nbinput.container,
    div.nboutput.container {
        flex-direction: column;
    }
}

/* input container */
div.nbinput.container {
    padding-top: 5px;
}

/* last container */
div.nblast.container {
    padding-bottom: 5px;
}

/* input prompt */
div.nbinput.container div.prompt pre {
    color: #307FC1;
}

/* output prompt */
div.nboutput.container div.prompt pre {
    color: #BF5B3D;
}

/* all prompts */
div.nbinput.container div.prompt,
div.nboutput.container div.prompt {
    width: 4.5ex;
    padding-top: 5px;
    position: relative;
    user-select: none;
}

div.nbinput.container div.prompt > div,
div.nboutput.container div.prompt > div {
    position: absolute;
    right: 0;
    margin-right: 0.3ex;
}

@media (max-width: 540px) {
    div.nbinput.container div.prompt,
    div.nboutput.container div.prompt {
        width: unset;
        text-align: left;
        padding: 0.4em;
    }
    div.nboutput.container div.prompt.empty {
        padding: 0;
    }

    div.nbinput.container div.prompt > div,
    div.nboutput.container div.prompt > div {
        position: unset;
    }
}

/* disable scrollbars on prompts */
div.nbinput.container div.prompt pre,
div.nboutput.container div.prompt pre {
    overflow: hidden;
}

/* input/output area */
div.nbinput.container div.input_area,
div.nboutput.container div.output_area {
    -webkit-flex: 1;
    flex: 1;
    overflow: auto;
}
@media (max-width: 540px) {
    div.nbinput.container div.input_area,
    div.nboutput.container div.output_area {
        width: 100%;
    }
}

/* input area */
div.nbinput.container div.input_area {
    border: 1px solid #e0e0e0;
    border-radius: 2px;
    background: #f5f5f5;
}

/* override MathJax center alignment in output cells */
div.nboutput.container div[class*=MathJax] {
    text-align: left !important;
}

/* override sphinx.ext.imgmath center alignment in output cells */
div.nboutput.container div.math p {
    text-align: left;
}

/* standard error */
div.nboutput.container div.output_area.stderr {
    background: #fdd;
}

/* ANSI colors */
.ansi-black-fg { color: #3E424D; }
.ansi-black-bg { background-color: #3E424D; }
.ansi-black-intense-fg { color: #282C36; }
.ansi-black-intense-bg { background-color: #282C36; }
.ansi-red-fg { color: #E75C58; }
.ansi-red-bg { background-color: #E75C58; }
.ansi-red-intense-fg { color: #B22B31; }
.ansi-red-intense-bg { background-color: #B22B31; }
.ansi-green-fg { color: #00A250; }
.ansi-green-bg { background-color: #00A250; }
.ansi-green-intense-fg { color: #007427; }
.ansi-green-intense-bg { background-color: #007427; }
.ansi-yellow-fg { color: #DDB62B; }
.ansi-yellow-bg { background-color: #DDB62B; }
.ansi-yellow-intense-fg { color: #B27D12; }
.ansi-yellow-intense-bg { background-color: #B27D12; }
.ansi-blue-fg { color: #208FFB; }
.ansi-blue-bg { background-color: #208FFB; }
.ansi-blue-intense-fg { color: #0065CA; }
.ansi-blue-intense-bg { background-color: #0065CA; }
.ansi-magenta-fg { color: #D160C4; }
.ansi-magenta-bg { background-color: #D160C4; }
.ansi-magenta-intense-fg { color: #A03196; }
.ansi-magenta-intense-bg { background-color: #A03196; }
.ansi-cyan-fg { color: #60C6C8; }
.ansi-cyan-bg { background-color: #60C6C8; }
.ansi-cyan-intense-fg { color: #258F8F; }
.ansi-cyan-intense-bg { background-color: #258F8F; }
.ansi-white-fg { color: #C5C1B4; }
.ansi-white-bg { background-color: #C5C1B4; }
.ansi-white-intense-fg { color: #A1A6B2; }
.ansi-white-intense-bg { background-color: #A1A6B2; }

.ansi-default-inverse-fg { color: #FFFFFF; }
.ansi-default-inverse-bg { background-color: #000000; }

.ansi-bold { font-weight: bold; }
.ansi-underline { text-decoration: underline; }


div.nbinput.container div.input_area div[class*=highlight] > pre,
div.nboutput.container div.output_area div[class*=highlight] > pre,
div.nboutput.container div.output_area div[class*=highlight].math,
div.nboutput.container div.output_area.rendered_html,
div.nboutput.container div.output_area > div.output_javascript,
div.nboutput.container div.output_area:not(.rendered_html) > img{
    padding: 5px;
}

/* fix copybtn overflow problem in chromium (needed for 'sphinx_copybutton') */
div.nbinput.container div.input_area > div[class^='highlight'],
div.nboutput.container div.output_area > div[class^='highlight']{
    overflow-y: hidden;
}

/* hide copybtn icon on prompts (needed for 'sphinx_copybutton') */
.prompt a.copybtn {
    display: none;
}

/* Some additional styling taken form the Jupyter notebook CSS */
div.rendered_html table {
  border: none;
  border-collapse: collapse;
  border-spacing: 0;
  color: black;
  font-size: 12px;
  table-layout: fixed;
}
div.rendered_html thead {
  border-bottom: 1px solid black;
  vertical-align: bottom;
}
div.rendered_html tr,
div.rendered_html th,
div.rendered_html td {
  text-align: right;
  vertical-align: middle;
  padding: 0.5em 0.5em;
  line-height: normal;
  white-space: normal;
  max-width: none;
  border: none;
}
div.rendered_html th {
  font-weight: bold;
}
div.rendered_html tbody tr:nth-child(odd) {
  background: #f5f5f5;
}
div.rendered_html tbody tr:hover {
  background: rgba(66, 165, 245, 0.2);
}
</style>
<div class="section" id="point_defect_static-calculation-style">
<h1>point_defect_static calculation style<a class="headerlink" href="#point_defect_static-calculation-style" title="Permalink to this headline">¶</a></h1>
<p><strong>Lucas M. Hale</strong>, <a class="reference external" href="mailto:lucas&#46;hale&#37;&#52;&#48;nist&#46;gov?Subject=ipr-demo">lucas<span>&#46;</span>hale<span>&#64;</span>nist<span>&#46;</span>gov</a>, <em>Materials Science and Engineering Division, NIST</em>.</p>
<p>Description updated: 2019-07-26</p>
<div class="section" id="Introduction">
<h2>Introduction<a class="headerlink" href="#Introduction" title="Permalink to this headline">¶</a></h2>
<p>The point_defect_static calculation style computes the formation energy of a point defect by comparing the energies of a system before and after a point defect is inserted. The resulting defect system is analyzed using a few different metrics to help characterize if the defect reconfigures to a different structure upon relaxation.</p>
<div class="section" id="Version-notes">
<h3>Version notes<a class="headerlink" href="#Version-notes" title="Permalink to this headline">¶</a></h3>
</div>
<div class="section" id="Additional-dependencies">
<h3>Additional dependencies<a class="headerlink" href="#Additional-dependencies" title="Permalink to this headline">¶</a></h3>
</div>
<div class="section" id="Disclaimers">
<h3>Disclaimers<a class="headerlink" href="#Disclaimers" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><p><a class="reference external" href="http://www.nist.gov/public_affairs/disclaimer.cfm">NIST disclaimers</a></p></li>
<li><p>The computed values of the point defect formation energies and elastic dipole tensors are sensitive to the size of the system. Larger systems minimize the interaction between the defects, and the affect that the defects have on the system’s pressure. Infinite system formation energies can be estimated by measuring the formation energy for multiple system sizes, and extrapolating to 1/natoms = 0.</p></li>
<li><p>Because only a static relaxation is performed, the final configuration might not be the true stable configuration. Additionally, the stable configuration may not correspond to any of the standard configurations characterized by the point-defect records in the iprPy/library. Running multiple configurations increases the likelihood of finding the true stable state, but it does not guarantee it. Alternatively, a dynamic simulation or a genetic algorithm may be more thorough.</p></li>
<li><p>The metrics used to identify reconfigurations are not guaranteed to work for all crystals and defects. Most notably, the metrics assume that the defect’s position coincides with a high symmetry site in the lattice.</p></li>
<li><p>The current version assumes that the initial defect-free base system is an elemental crystal structure. The formation energy expression needs to be updated to handle multi-component crystals.</p></li>
</ul>
</div>
</div>
<div class="section" id="Method-and-Theory">
<h2>Method and Theory<a class="headerlink" href="#Method-and-Theory" title="Permalink to this headline">¶</a></h2>
<p>The method starts with a bulk initial system, and relaxes the atomic positions with a LAMMPS simulation that performs an energy/force minimization. The cohesive energy, <span class="math notranslate nohighlight">\(E_{coh}\)</span>, is taken by dividing the system’s total energy by the number of atoms in the system.</p>
<p>A corresponding defect system is then constructed using the atomman.defect.point() function. The defect system is relaxed using the same energy/force minimization as was done with the bulk system. The formation energy of the defect, <span class="math notranslate nohighlight">\(E_{f}^{ptd}\)</span>, is obtained as</p>
<div class="math notranslate nohighlight">
\[E_{f}^{ptd} = E_{total}^{ptd} - E_{coh} * N^{ptd},\]</div>
<p>where <span class="math notranslate nohighlight">\(E_{total}^{ptd}\)</span> is the total potential energy of the relaxed defect system, and <span class="math notranslate nohighlight">\(N^{ptd}\)</span> is the number of atoms in the defect system.</p>
<p>The elastic dipole tensor, <span class="math notranslate nohighlight">\(P_{ij}\)</span>, is also estimated for the point defect. <span class="math notranslate nohighlight">\(P_{ij}\)</span> is a symmetric second rank tensor that characterizes the elastic nature of the defect. Here, <span class="math notranslate nohighlight">\(P_{ij}\)</span> is estimated using [<a class="reference external" href="https://doi.org/10.1080/01418618108239410">1</a>, <a class="reference external" href="https://doi.org/10.1080/01418618308244326">2</a>]</p>
<div class="math notranslate nohighlight">
\[P_{ij} = -V \langle \sigma_{ij} \rangle,\]</div>
<p>where <span class="math notranslate nohighlight">\(V\)</span> is the system cell volume and <span class="math notranslate nohighlight">\(\langle \sigma_{ij} \rangle\)</span> is the residual stress on the system due to the defect, which is computed using the measured cell stresses (pressures) of the defect-free system, <span class="math notranslate nohighlight">\(\sigma_{ij}^{0}\)</span>, and the defect-containing system, <span class="math notranslate nohighlight">\(\sigma_{ij}^{ptd}\)</span></p>
<div class="math notranslate nohighlight">
\[\langle \sigma_{ij} \rangle = \sigma_{ij}^{ptd} - \sigma_{ij}^{0}.\]</div>
<p>The atomman.defect.point() method allows for the generation of four types of point defects:</p>
<ul class="simple">
<li><p><strong>vacancy</strong>, where an atom at a specified location is deleted.</p></li>
<li><p><strong>interstitial</strong>, where an extra atom is inserted at a specified location (that does not correspond to an existing atom).</p></li>
<li><p><strong>substitutional</strong>, where the atomic type of an atom at a specified location is changed.</p></li>
<li><p><strong>dumbbell</strong> interstitial, where an atom at a specified location is replaced by a pair of atoms equidistant from the original atom’s position.</p></li>
</ul>
<p>Point defect complexes (clusters, balanced ionic defects, etc.) can also be constructed piecewise from these basic types.</p>
<p>The final defect-containing system is analyzed using a few simple metrics to determine whether or not the point defect configuration has relaxed to a lower energy configuration:</p>
<ul class="simple">
<li><p><strong>centrosummation</strong> adds up the vector positions of atoms relative to the defect’s position for all atoms within a specified cutoff. In most simple crystals, the defect positions are associated with high symmetry lattice sites in which the centrosummation about that point in the defect-free system will be zero. If the defect only hydrostatically displaces neighbor atoms, then the centrosummation should also be zero for the defect system. This is computed for all defect types.</p></li>
</ul>
<div class="math notranslate nohighlight">
\[\vec{cs} = \sum_i^N{\left( \vec{r}_i - \vec{r}_{ptd} \right)}\]</div>
<ul class="simple">
<li><p><strong>position_shift</strong> is the change in position of an interstitial or substitutional atom following relaxation of the system. A non-zero value indicates that the defect atom has moved from its initially ideal position.</p></li>
</ul>
<div class="math notranslate nohighlight">
\[\Delta \vec{r} = \vec{r}_{ptd} - \vec{r}_{ptd}^{0}\]</div>
<ul class="simple">
<li><p><strong>db_vect_shift</strong> compares the unit vector associated with the pair of atoms in a dumbbell interstitial before and after relaxation. A non-zero value indicates that the dumbbell has rotated from its ideal configuration.</p></li>
</ul>
<div class="math notranslate nohighlight">
\[\Delta \vec{db} = \frac{\vec{r}_{db1} - \vec{r}_{db2}}{|\vec{r}_{db1} - \vec{r}_{db2}|} - \frac{\vec{r}_{db1}^0 - \vec{r}_{db2}^0}{|\vec{r}_{db1}^0 - \vec{r}_{db2}^0|}\]</div>
<p>If any of the metrics have values not close to (0,0,0), then there was likely an atomic configuration relaxation.</p>
<p>The final defect system and the associated perfect base system are retained in the calculation’s archive. The calculation’s record reports the base system’s cohesive energy, the point defect’s formation energy, and the values of any of the reconfiguration metrics used.</p>
</div>
<div class="section" id="Demonstration">
<h2>Demonstration<a class="headerlink" href="#Demonstration" title="Permalink to this headline">¶</a></h2>
<div class="section" id="1.-Setup">
<h3>1. Setup<a class="headerlink" href="#1.-Setup" title="Permalink to this headline">¶</a></h3>
<div class="section" id="1.1.-Library-imports">
<h4>1.1. Library imports<a class="headerlink" href="#1.1.-Library-imports" title="Permalink to this headline">¶</a></h4>
<p>Import libraries needed by the calculation. The external libraries used are:</p>
<ul class="simple">
<li><p><a class="reference external" href="http://www.numpy.org/">numpy</a></p></li>
<li><p><a class="reference external" href="https://github.com/usnistgov/DataModelDict">DataModelDict</a></p></li>
<li><p><a class="reference external" href="https://github.com/usnistgov/atomman">atomman</a></p></li>
<li><p><a class="reference external" href="https://github.com/usnistgov/iprPy">iprPy</a></p></li>
</ul>
<div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="c1"># Standard library imports</span>
<span class="kn">from</span> <span class="nn">pathlib</span> <span class="k">import</span> <span class="n">Path</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">uuid</span>
<span class="kn">import</span> <span class="nn">shutil</span>
<span class="kn">import</span> <span class="nn">datetime</span>
<span class="kn">from</span> <span class="nn">copy</span> <span class="k">import</span> <span class="n">deepcopy</span>

<span class="c1"># http://www.numpy.org/</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>

<span class="c1"># https://github.com/usnistgov/DataModelDict</span>
<span class="kn">from</span> <span class="nn">DataModelDict</span> <span class="k">import</span> <span class="n">DataModelDict</span> <span class="k">as</span> <span class="n">DM</span>

<span class="c1"># https://github.com/usnistgov/atomman</span>
<span class="kn">import</span> <span class="nn">atomman</span> <span class="k">as</span> <span class="nn">am</span>
<span class="kn">import</span> <span class="nn">atomman.lammps</span> <span class="k">as</span> <span class="nn">lmp</span>
<span class="kn">import</span> <span class="nn">atomman.unitconvert</span> <span class="k">as</span> <span class="nn">uc</span>

<span class="c1"># https://github.com/usnistgov/iprPy</span>
<span class="kn">import</span> <span class="nn">iprPy</span>

<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Notebook last executed on&#39;</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">(),</span> <span class="s1">&#39;using iprPy version&#39;</span><span class="p">,</span> <span class="n">iprPy</span><span class="o">.</span><span class="n">__version__</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="nboutput nblast docutils container">
<div class="prompt empty docutils container">
</div>
<div class="output_area docutils container">
<div class="highlight"><pre>
Notebook last executed on 2019-07-29 using iprPy version 0.9.0
</pre></div></div>
</div>
</div>
<div class="section" id="1.2.-Default-calculation-setup">
<h4>1.2. Default calculation setup<a class="headerlink" href="#1.2.-Default-calculation-setup" title="Permalink to this headline">¶</a></h4>
<div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="c1"># Specify calculation style</span>
<span class="n">calc_style</span> <span class="o">=</span> <span class="s1">&#39;point_defect_static&#39;</span>

<span class="c1"># If workingdir is already set, then do nothing (already in correct folder)</span>
<span class="k">try</span><span class="p">:</span>
    <span class="n">workingdir</span> <span class="o">=</span> <span class="n">workingdir</span>

<span class="c1"># Change to workingdir if not already there</span>
<span class="k">except</span><span class="p">:</span>
    <span class="n">workingdir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="s1">&#39;calculationfiles&#39;</span><span class="p">,</span> <span class="n">calc_style</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">workingdir</span><span class="o">.</span><span class="n">is_dir</span><span class="p">():</span>
        <span class="n">workingdir</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
    <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">workingdir</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="section" id="2.-Assign-values-for-the-calculation’s-run-parameters">
<h3>2. Assign values for the calculation’s run parameters<a class="headerlink" href="#2.-Assign-values-for-the-calculation’s-run-parameters" title="Permalink to this headline">¶</a></h3>
<div class="section" id="2.1.-Specify-system-specific-paths">
<h4>2.1. Specify system-specific paths<a class="headerlink" href="#2.1.-Specify-system-specific-paths" title="Permalink to this headline">¶</a></h4>
<ul class="simple">
<li><p><strong>lammps_command</strong> (required) is the LAMMPS command to use.</p></li>
<li><p><strong>mpi_command</strong> MPI command for running LAMMPS in parallel. A value of None will run simulations serially.</p></li>
</ul>
<div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">lammps_command</span> <span class="o">=</span> <span class="s1">&#39;lmp_serial&#39;</span>
<span class="n">mpi_command</span> <span class="o">=</span> <span class="kc">None</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="2.2.-Load-interatomic-potential">
<h4>2.2. Load interatomic potential<a class="headerlink" href="#2.2.-Load-interatomic-potential" title="Permalink to this headline">¶</a></h4>
<ul class="simple">
<li><p><strong>potential_name</strong> gives the name of the potential_LAMMPS reference record in the iprPy library to use for the calculation.</p></li>
<li><p><strong>potential_file</strong> gives the path to the potential_LAMMPS reference record to use. Here, this parameter is automatically generated using potential_name and librarydir.</p></li>
<li><p><strong>potential_dir</strong> gives the path for the folder containing the artifacts associated with the potential (i.e. eam.alloy file). Here, this parameter is automatically generated using potential_name and librarydir.</p></li>
<li><p><strong>potential</strong> is an atomman.lammps.Potential object (required). Here, this parameter is automatically generated from potential_file and potential_dir.</p></li>
</ul>
<div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">potential_name</span> <span class="o">=</span> <span class="s1">&#39;1999--Mishin-Y--Ni--LAMMPS--ipr1&#39;</span>

<span class="c1"># Define potential_file and potential_dir using librarydir and potential_name</span>
<span class="n">potential_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">iprPy</span><span class="o">.</span><span class="n">libdir</span><span class="p">,</span> <span class="s1">&#39;potential_LAMMPS&#39;</span><span class="p">,</span> <span class="n">f</span><span class="s1">&#39;</span><span class="si">{potential_name}</span><span class="s1">.json&#39;</span><span class="p">)</span>
<span class="n">potential_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">iprPy</span><span class="o">.</span><span class="n">libdir</span><span class="p">,</span> <span class="s1">&#39;potential_LAMMPS&#39;</span><span class="p">,</span> <span class="n">potential_name</span><span class="p">)</span>

<span class="c1"># Initialize Potential object using potential_file and potential_dir.</span>
<span class="n">potential</span> <span class="o">=</span> <span class="n">lmp</span><span class="o">.</span><span class="n">Potential</span><span class="p">(</span><span class="n">potential_file</span><span class="p">,</span> <span class="n">potential_dir</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Successfully loaded potential&#39;</span><span class="p">,</span> <span class="n">potential</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="nboutput nblast docutils container">
<div class="prompt empty docutils container">
</div>
<div class="output_area docutils container">
<div class="highlight"><pre>
Successfully loaded potential 1999--Mishin-Y--Ni--LAMMPS--ipr1
</pre></div></div>
</div>
</div>
<div class="section" id="2.3.-Load-initial-unit-cell-system">
<h4>2.3. Load initial unit cell system<a class="headerlink" href="#2.3.-Load-initial-unit-cell-system" title="Permalink to this headline">¶</a></h4>
<ul class="simple">
<li><p><strong>prototype_name</strong> gives the name of the crystal_prototype reference record in the iprPy library to load.</p></li>
<li><p><strong>symbols</strong> is a list of the potential’s elemental model symbols to associate with the unique atom types of the loaded system.</p></li>
<li><p><strong>box_parameters</strong> is a list of the a, b, c lattice constants to assign to the loaded file.</p></li>
<li><p><strong>load_file</strong> gives the path to the atomic configuration file to load for the ucell system. Here, this is generated automatically using prototype_name and librarydir.</p></li>
<li><p><strong>load_style</strong> specifies the format of load_file. Here, this is automatically set for crystal_prototype records.</p></li>
<li><p><strong>load_options</strong> specifies any other keyword options for properly loading the load_file. Here, this is automatically set for crystal_prototype records.</p></li>
<li><p><strong>ucell</strong> is an atomman.System representing a fundamental unit cell of the system (required). Here, this is generated using the load parameters and symbols.</p></li>
</ul>
<div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">prototype_name</span> <span class="o">=</span> <span class="s1">&#39;A1--Cu--fcc&#39;</span>
<span class="n">symbols</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Ni&#39;</span><span class="p">]</span>
<span class="n">box_parameters</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">([</span><span class="mf">3.52</span><span class="p">,</span> <span class="mf">3.52</span><span class="p">,</span> <span class="mf">3.52</span><span class="p">],</span> <span class="s1">&#39;angstrom&#39;</span><span class="p">)</span>

<span class="c1"># Define load_file using librarydir and prototype_name</span>
<span class="n">load_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">iprPy</span><span class="o">.</span><span class="n">libdir</span><span class="p">,</span> <span class="s1">&#39;crystal_prototype&#39;</span><span class="p">,</span> <span class="n">f</span><span class="s1">&#39;</span><span class="si">{prototype_name}</span><span class="s1">.json&#39;</span><span class="p">)</span>

<span class="c1"># Define load_style and load_options for crystal_prototype records</span>
<span class="n">load_style</span> <span class="o">=</span> <span class="s1">&#39;system_model&#39;</span>
<span class="n">load_options</span> <span class="o">=</span> <span class="p">{}</span>

<span class="c1"># Create ucell by loading prototype record</span>
<span class="n">ucell</span> <span class="o">=</span> <span class="n">am</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">load_style</span><span class="p">,</span> <span class="n">load_file</span><span class="p">,</span> <span class="n">symbols</span><span class="o">=</span><span class="n">symbols</span><span class="p">,</span> <span class="o">**</span><span class="n">load_options</span><span class="p">)</span>

<span class="c1"># Rescale ucell using box_parameters</span>
<span class="n">ucell</span><span class="o">.</span><span class="n">box_set</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="n">box_parameters</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">b</span><span class="o">=</span><span class="n">box_parameters</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">c</span><span class="o">=</span><span class="n">box_parameters</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">scale</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>

<span class="nb">print</span><span class="p">(</span><span class="n">ucell</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="nboutput nblast docutils container">
<div class="prompt empty docutils container">
</div>
<div class="output_area docutils container">
<div class="highlight"><pre>
avect =  [ 3.520,  0.000,  0.000]
bvect =  [ 0.000,  3.520,  0.000]
cvect =  [ 0.000,  0.000,  3.520]
origin = [ 0.000,  0.000,  0.000]
natoms = 4
natypes = 1
symbols = (&#39;Ni&#39;,)
pbc = [ True  True  True]
per-atom properties = [&#39;atype&#39;, &#39;pos&#39;]
     id |   atype |  pos[0] |  pos[1] |  pos[2]
      0 |       1 |   0.000 |   0.000 |   0.000
      1 |       1 |   0.000 |   1.760 |   1.760
      2 |       1 |   1.760 |   0.000 |   1.760
      3 |       1 |   1.760 |   1.760 |   0.000
</pre></div></div>
</div>
</div>
<div class="section" id="2.4.-Specify-the-defect-parameters">
<h4>2.4. Specify the defect parameters<a class="headerlink" href="#2.4.-Specify-the-defect-parameters" title="Permalink to this headline">¶</a></h4>
<ul class="simple">
<li><p><strong>pointdefect_name</strong> gives the name of a point-defect reference record in the iprPy library containing point defect input parameters.</p></li>
<li><p><strong>pointdefect_file</strong> gives the path to a point_defect reference containing point defect input parameters. Here, this is built automatically using pointdefect_name and librarydir.</p></li>
<li><p><strong>point_kwargs</strong> (required) is a dictionary or list of dictonaries containing parameters for generating the defect. Here, values are extracted from pointdefect_file. Allowed keywords are:</p>
<ul>
<li><p><strong>ptd_type</strong> indicates which defect type to generate: ‘v’ for vacancy, ‘i’ for interstitial, ‘s’ for substitutional, or ‘db’ for dumbbell.</p></li>
<li><p><strong>atype</strong> is the atom type to assign to the defect atom (‘i’, ‘s’, ‘db’ ptd_types).</p></li>
<li><p><strong>pos</strong> specifies the position for adding the defect atom (all ptd_types).</p></li>
<li><p><strong>ptd_id</strong> specifies the id of an atom in the initial system where the defect is to be added. Alternative to using pos (‘v’, ‘s’, ‘db’ ptd_types).</p></li>
<li><p><strong>db_vect</strong> gives the vector associated with the dumbbell interstitial to generate (‘db’ ptd_type).</p></li>
<li><p><strong>scale</strong> indicates if pos and db_vect are in absolute (False) or box-relative (True) coordinates. Default is False.</p></li>
<li><p><strong>atol</strong> is the absolute tolerance for position-based searching. Default is 1e-3 angstroms.</p></li>
</ul>
</li>
</ul>
<div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">pointdefect_name</span> <span class="o">=</span> <span class="s1">&#39;A1--Cu--fcc--vacancy&#39;</span>
<span class="c1">#pointdefect_name = &#39;A1--Cu--fcc--1nn-divacancy&#39;</span>
<span class="c1">#pointdefect_name = &#39;A1--Cu--fcc--2nn-divacancy&#39;</span>
<span class="c1">#pointdefect_name = &#39;A1--Cu--fcc--100-dumbbell&#39;</span>
<span class="c1">#pointdefect_name = &#39;A1--Cu--fcc--110-dumbbell&#39;</span>
<span class="c1">#pointdefect_name = &#39;A1--Cu--fcc--111-dumbbell&#39;</span>
<span class="c1">#pointdefect_name = &#39;A1--Cu--fcc--octahedral-interstitial&#39;</span>
<span class="c1">#pointdefect_name = &#39;A1--Cu--fcc--tetrahedral-interstitial&#39;</span>
<span class="c1">#pointdefect_name = &#39;A1--Cu--fcc--crowdion-interstitial&#39;</span>

<span class="c1"># Define pointdefect_file using librarydir and pointdefect_name</span>
<span class="n">pointdefect_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">iprPy</span><span class="o">.</span><span class="n">libdir</span><span class="p">,</span> <span class="s1">&#39;point_defect&#39;</span><span class="p">,</span> <span class="n">f</span><span class="s1">&#39;</span><span class="si">{pointdefect_name}</span><span class="s1">.json&#39;</span><span class="p">)</span>

<span class="c1"># Parse pointdefect_file using iprPy.input.interpret()</span>
<span class="n">defectinputs</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;ucell&#39;</span><span class="p">:</span><span class="n">ucell</span><span class="p">,</span> <span class="s1">&#39;pointdefect_file&#39;</span><span class="p">:</span><span class="n">pointdefect_file</span><span class="p">}</span>
<span class="n">iprPy</span><span class="o">.</span><span class="n">input</span><span class="o">.</span><span class="n">subset</span><span class="p">(</span><span class="s1">&#39;pointdefect&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">interpret</span><span class="p">(</span><span class="n">defectinputs</span><span class="p">)</span>

<span class="c1"># Extract point_kwargs</span>
<span class="n">point_kwargs</span> <span class="o">=</span> <span class="n">defectinputs</span><span class="p">[</span><span class="s1">&#39;point_kwargs&#39;</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;point_kwargs =&#39;</span><span class="p">)</span>
<span class="n">point_kwargs</span>
</pre></div>
</div>
</div>
<div class="nboutput docutils container">
<div class="prompt empty docutils container">
</div>
<div class="output_area docutils container">
<div class="highlight"><pre>
point_kwargs =
</pre></div></div>
</div>
<div class="nboutput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]:
</pre></div>
</div>
<div class="output_area docutils container">
<div class="highlight"><pre>
[{&#39;ptd_type&#39;: &#39;v&#39;, &#39;pos&#39;: array([0., 0., 0.]), &#39;scale&#39;: False}]
</pre></div></div>
</div>
</div>
<div class="section" id="2.5.-Modify-system">
<h4>2.5. Modify system<a class="headerlink" href="#2.5.-Modify-system" title="Permalink to this headline">¶</a></h4>
<ul class="simple">
<li><p><strong>sizemults</strong> list of three integers specifying how many times the ucell vectors of <span class="math notranslate nohighlight">\(a\)</span>, <span class="math notranslate nohighlight">\(b\)</span> and <span class="math notranslate nohighlight">\(c\)</span> are replicated in creating system.</p></li>
<li><p><strong>system</strong> is an atomman.System to perform the scan on (required).</p></li>
</ul>
<div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">sizemults</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">]</span>

<span class="c1"># Generate system by supersizing ucell</span>
<span class="n">system</span> <span class="o">=</span> <span class="n">ucell</span><span class="o">.</span><span class="n">supersize</span><span class="p">(</span><span class="o">*</span><span class="n">sizemults</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;# of atoms in system =&#39;</span><span class="p">,</span> <span class="n">system</span><span class="o">.</span><span class="n">natoms</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="nboutput nblast docutils container">
<div class="prompt empty docutils container">
</div>
<div class="output_area docutils container">
<div class="highlight"><pre>
# of atoms in system = 4000
</pre></div></div>
</div>
</div>
<div class="section" id="2.6.-Specify-calculation-specific-run-parameters">
<h4>2.6. Specify calculation-specific run parameters<a class="headerlink" href="#2.6.-Specify-calculation-specific-run-parameters" title="Permalink to this headline">¶</a></h4>
<ul class="simple">
<li><p><strong>energytolerance</strong> is the energy tolerance to use during the minimizations. This is unitless.</p></li>
<li><p><strong>forcetolerance</strong> is the force tolerance to use during the minimizations. This is in energy/length units.</p></li>
<li><p><strong>maxiterations</strong> is the maximum number of minimization iterations to use.</p></li>
<li><p><strong>maxevaluations</strong> is the maximum number of minimization evaluations to use.</p></li>
<li><p><strong>maxatommotion</strong> is the largest distance that an atom is allowed to move during a minimization iteration. This is in length units.</p></li>
</ul>
<div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">energytolerance</span> <span class="o">=</span> <span class="mf">1e-8</span>
<span class="n">forcetolerance</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="s1">&#39;eV/angstrom&#39;</span><span class="p">)</span>
<span class="n">maxiterations</span> <span class="o">=</span> <span class="mi">10000</span>
<span class="n">maxevaluations</span> <span class="o">=</span> <span class="mi">100000</span>
<span class="n">maxatommotion</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="mf">0.01</span><span class="p">,</span> <span class="s1">&#39;angstrom&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="section" id="3.-Define-calculation-function(s)-and-generate-template-LAMMPS-script(s)">
<h3>3. Define calculation function(s) and generate template LAMMPS script(s)<a class="headerlink" href="#3.-Define-calculation-function(s)-and-generate-template-LAMMPS-script(s)" title="Permalink to this headline">¶</a></h3>
<div class="section" id="3.1.-min.template">
<h4>3.1. min.template<a class="headerlink" href="#3.1.-min.template" title="Permalink to this headline">¶</a></h4>
<div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[9]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;min.template&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;# LAMMPS input script that performs a simple energy minimization</span>

<span class="s2">box tilt large</span>

<span class="s2">&lt;atomman_system_info&gt;</span>

<span class="s2">&lt;atomman_pair_info&gt;</span>

<span class="s2">thermo_style custom step lx ly lz pxx pyy pzz pxy pxz pyz pe</span>
<span class="s2">thermo_modify format float </span><span class="si">%.13e</span><span class="s2"></span>

<span class="s2">compute peatom all pe/atom</span>

<span class="s2">dump dumpit all custom &lt;maxeval&gt; atom.* id type x y z c_peatom</span>
<span class="s2">dump_modify dumpit format &lt;dump_modify_format&gt;</span>

<span class="s2">min_modify dmax &lt;dmax&gt;</span>

<span class="s2">minimize &lt;etol&gt; &lt;ftol&gt; &lt;maxiter&gt; &lt;maxeval&gt;&quot;&quot;&quot;</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="3.2.-pointdefect()">
<h4>3.2. pointdefect()<a class="headerlink" href="#3.2.-pointdefect()" title="Permalink to this headline">¶</a></h4>
<div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="k">def</span> <span class="nf">pointdefect</span><span class="p">(</span><span class="n">lammps_command</span><span class="p">,</span> <span class="n">system</span><span class="p">,</span> <span class="n">potential</span><span class="p">,</span> <span class="n">point_kwargs</span><span class="p">,</span>
                <span class="n">mpi_command</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">etol</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">ftol</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">maxiter</span><span class="o">=</span><span class="mi">10000</span><span class="p">,</span>
                <span class="n">maxeval</span><span class="o">=</span><span class="mi">100000</span><span class="p">,</span> <span class="n">dmax</span><span class="o">=</span><span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="mf">0.01</span><span class="p">,</span> <span class="s1">&#39;angstrom&#39;</span><span class="p">)):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Adds one or more point defects to a system and evaluates the defect</span>
<span class="sd">    formation energy.</span>

<span class="sd">    Parameters</span>
<span class="sd">    ----------</span>
<span class="sd">    lammps_command :str</span>
<span class="sd">        Command for running LAMMPS.</span>
<span class="sd">    system : atomman.System</span>
<span class="sd">        The system to perform the calculation on.</span>
<span class="sd">    potential : atomman.lammps.Potential</span>
<span class="sd">        The LAMMPS implemented potential to use.</span>
<span class="sd">    point_kwargs : dict or list of dict</span>
<span class="sd">        One or more dictionaries containing the keyword arguments for</span>
<span class="sd">        the atomman.defect.point() function to generate specific point</span>
<span class="sd">        defect configuration(s).</span>
<span class="sd">    mpi_command : str, optional</span>
<span class="sd">        The MPI command for running LAMMPS in parallel.  If not given, LAMMPS</span>
<span class="sd">        will run serially.</span>
<span class="sd">    sim_directory : str, optional</span>
<span class="sd">        The path to the directory to perform the simuation in.  If not</span>
<span class="sd">        given, will use the current working directory.</span>
<span class="sd">    etol : float, optional</span>
<span class="sd">        The energy tolerance for the structure minimization. This value is</span>
<span class="sd">        unitless. (Default is 0.0).</span>
<span class="sd">    ftol : float, optional</span>
<span class="sd">        The force tolerance for the structure minimization. This value is in</span>
<span class="sd">        units of force. (Default is 0.0).</span>
<span class="sd">    maxiter : int, optional</span>
<span class="sd">        The maximum number of minimization iterations to use (default is</span>
<span class="sd">        10000).</span>
<span class="sd">    maxeval : int, optional</span>
<span class="sd">        The maximum number of minimization evaluations to use (default is</span>
<span class="sd">        100000).</span>
<span class="sd">    dmax : float, optional</span>
<span class="sd">        The maximum distance in length units that any atom is allowed to relax</span>
<span class="sd">        in any direction during a single minimization iteration (default is</span>
<span class="sd">        0.01 Angstroms).</span>

<span class="sd">    Returns</span>
<span class="sd">    -------</span>
<span class="sd">    dict</span>
<span class="sd">        Dictionary of results consisting of keys:</span>

<span class="sd">        - **&#39;E_coh&#39;** (*float*) - The cohesive energy of the bulk system.</span>
<span class="sd">        - **&#39;E_ptd_f&#39;** (*float*) - The point.defect formation energy.</span>
<span class="sd">        - **&#39;E_total_base&#39;** (*float*) - The total potential energy of the</span>
<span class="sd">          relaxed bulk system.</span>
<span class="sd">        - **&#39;E_total_ptd&#39;** (*float*) - The total potential energy of the</span>
<span class="sd">          relaxed defect system.</span>
<span class="sd">        - **&#39;system_base&#39;** (*atomman.System*) - The relaxed bulk system.</span>
<span class="sd">        - **&#39;system_ptd&#39;** (*atomman.System*) - The relaxed defect system.</span>
<span class="sd">        - **&#39;dumpfile_base&#39;** (*str*) - The filename of the LAMMPS dump file</span>
<span class="sd">          for the relaxed bulk system.</span>
<span class="sd">        - **&#39;dumpfile_ptd&#39;** (*str*) - The filename of the LAMMPS dump file</span>
<span class="sd">          for the relaxed defect system.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="c1"># Get script&#39;s location if __file__ exists</span>
        <span class="n">script_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="c1"># Use cwd otherwise</span>
        <span class="n">script_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span>

    <span class="c1"># Get lammps units</span>
    <span class="n">lammps_units</span> <span class="o">=</span> <span class="n">lmp</span><span class="o">.</span><span class="n">style</span><span class="o">.</span><span class="n">unit</span><span class="p">(</span><span class="n">potential</span><span class="o">.</span><span class="n">units</span><span class="p">)</span>

    <span class="c1">#Get lammps version date</span>
    <span class="n">lammps_date</span> <span class="o">=</span> <span class="n">lmp</span><span class="o">.</span><span class="n">checkversion</span><span class="p">(</span><span class="n">lammps_command</span><span class="p">)[</span><span class="s1">&#39;date&#39;</span><span class="p">]</span>

    <span class="c1"># Define lammps variables</span>
    <span class="n">lammps_variables</span> <span class="o">=</span> <span class="p">{}</span>
    <span class="n">system_info</span> <span class="o">=</span> <span class="n">system</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="s1">&#39;atom_data&#39;</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="s1">&#39;perfect.dat&#39;</span><span class="p">,</span>
                              <span class="n">units</span><span class="o">=</span><span class="n">potential</span><span class="o">.</span><span class="n">units</span><span class="p">,</span>
                              <span class="n">atom_style</span><span class="o">=</span><span class="n">potential</span><span class="o">.</span><span class="n">atom_style</span><span class="p">)</span>
    <span class="n">lammps_variables</span><span class="p">[</span><span class="s1">&#39;atomman_system_info&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">system_info</span>
    <span class="n">lammps_variables</span><span class="p">[</span><span class="s1">&#39;atomman_pair_info&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">potential</span><span class="o">.</span><span class="n">pair_info</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">symbols</span><span class="p">)</span>
    <span class="n">lammps_variables</span><span class="p">[</span><span class="s1">&#39;etol&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">etol</span>
    <span class="n">lammps_variables</span><span class="p">[</span><span class="s1">&#39;ftol&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">get_in_units</span><span class="p">(</span><span class="n">ftol</span><span class="p">,</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;force&#39;</span><span class="p">])</span>
    <span class="n">lammps_variables</span><span class="p">[</span><span class="s1">&#39;maxiter&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">maxiter</span>
    <span class="n">lammps_variables</span><span class="p">[</span><span class="s1">&#39;maxeval&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">maxeval</span>
    <span class="n">lammps_variables</span><span class="p">[</span><span class="s1">&#39;dmax&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">dmax</span>

    <span class="c1"># Set dump_modify_format based on lammps_date</span>
    <span class="k">if</span> <span class="n">lammps_date</span> <span class="o">&lt;</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span>
        <span class="n">lammps_variables</span><span class="p">[</span><span class="s1">&#39;dump_modify_format&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&quot;</span><span class="si">%d</span><span class="s1"> </span><span class="si">%d</span><span class="s1"> </span><span class="si">%.13e</span><span class="s1"> </span><span class="si">%.13e</span><span class="s1"> </span><span class="si">%.13e</span><span class="s1"> </span><span class="si">%.13e</span><span class="s1"> </span><span class="si">%.13e</span><span class="s1"> </span><span class="si">%.13e</span><span class="s1"> </span><span class="si">%.13e</span><span class="s1">&quot;&#39;</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">lammps_variables</span><span class="p">[</span><span class="s1">&#39;dump_modify_format&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;float </span><span class="si">%.13e</span><span class="s1">&#39;</span>

    <span class="c1"># Write lammps input script</span>
    <span class="n">template_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">script_dir</span><span class="p">,</span> <span class="s1">&#39;min.template&#39;</span><span class="p">)</span>
    <span class="n">lammps_script</span> <span class="o">=</span> <span class="s1">&#39;min.in&#39;</span>
    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">template_file</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
        <span class="n">template</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">lammps_script</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">iprPy</span><span class="o">.</span><span class="n">tools</span><span class="o">.</span><span class="n">filltemplate</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">lammps_variables</span><span class="p">,</span> <span class="s1">&#39;&lt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&gt;&#39;</span><span class="p">))</span>

    <span class="c1"># Run lammps to relax perfect.dat</span>
    <span class="n">output</span> <span class="o">=</span> <span class="n">lmp</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">lammps_command</span><span class="p">,</span> <span class="n">lammps_script</span><span class="p">,</span> <span class="n">mpi_command</span><span class="p">)</span>

    <span class="c1"># Extract LAMMPS thermo data.</span>
    <span class="n">thermo</span> <span class="o">=</span> <span class="n">output</span><span class="o">.</span><span class="n">simulations</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;thermo&#39;</span><span class="p">]</span>
    <span class="n">E_total_base</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">PotEng</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
                                   <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;energy&#39;</span><span class="p">])</span>
    <span class="n">E_coh</span> <span class="o">=</span> <span class="n">E_total_base</span> <span class="o">/</span> <span class="n">system</span><span class="o">.</span><span class="n">natoms</span>

    <span class="n">pxx</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pxx</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pyy</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pyy</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pzz</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pzz</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pxy</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pxy</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pxz</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pxz</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pyz</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pyz</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pressure_base</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="n">pxx</span><span class="p">,</span> <span class="n">pxy</span><span class="p">,</span> <span class="n">pxz</span><span class="p">],</span> <span class="p">[</span><span class="n">pxy</span><span class="p">,</span> <span class="n">pyy</span><span class="p">,</span> <span class="n">pyz</span><span class="p">],</span> <span class="p">[</span><span class="n">pxz</span><span class="p">,</span> <span class="n">pyz</span><span class="p">,</span> <span class="n">pzz</span><span class="p">]])</span>

    <span class="c1"># Rename log file</span>
    <span class="n">shutil</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="s1">&#39;log.lammps&#39;</span><span class="p">,</span> <span class="s1">&#39;min-perfect-log.lammps&#39;</span><span class="p">)</span>

    <span class="c1"># Load relaxed system from dump file and copy old box vectors because</span>
    <span class="c1"># dump files crop the values.</span>
    <span class="n">last_dump_file</span> <span class="o">=</span> <span class="s1">&#39;atom.&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Step</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    <span class="n">system_base</span> <span class="o">=</span> <span class="n">am</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s1">&#39;atom_dump&#39;</span><span class="p">,</span> <span class="n">last_dump_file</span><span class="p">,</span> <span class="n">symbols</span><span class="o">=</span><span class="n">system</span><span class="o">.</span><span class="n">symbols</span><span class="p">)</span>
    <span class="n">system_base</span><span class="o">.</span><span class="n">box_set</span><span class="p">(</span><span class="n">vects</span><span class="o">=</span><span class="n">system</span><span class="o">.</span><span class="n">box</span><span class="o">.</span><span class="n">vects</span><span class="p">)</span>
    <span class="n">system_base</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="s1">&#39;atom_dump&#39;</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="s1">&#39;perfect.dump&#39;</span><span class="p">)</span>

    <span class="c1"># Add defect(s)</span>
    <span class="n">system_ptd</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="n">system_base</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">point_kwargs</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
        <span class="n">point_kwargs</span> <span class="o">=</span> <span class="p">[</span><span class="n">point_kwargs</span><span class="p">]</span>
    <span class="k">for</span> <span class="n">pkwargs</span> <span class="ow">in</span> <span class="n">point_kwargs</span><span class="p">:</span>
        <span class="n">system_ptd</span> <span class="o">=</span> <span class="n">am</span><span class="o">.</span><span class="n">defect</span><span class="o">.</span><span class="n">point</span><span class="p">(</span><span class="n">system_ptd</span><span class="p">,</span> <span class="o">**</span><span class="n">pkwargs</span><span class="p">)</span>

    <span class="c1"># Update lammps variables</span>
    <span class="n">system_info</span> <span class="o">=</span> <span class="n">system_ptd</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="s1">&#39;atom_data&#39;</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="s1">&#39;defect.dat&#39;</span><span class="p">,</span>
                                  <span class="n">units</span> <span class="o">=</span> <span class="n">potential</span><span class="o">.</span><span class="n">units</span><span class="p">,</span>
                                  <span class="n">atom_style</span> <span class="o">=</span> <span class="n">potential</span><span class="o">.</span><span class="n">atom_style</span><span class="p">)</span>
    <span class="n">lammps_variables</span><span class="p">[</span><span class="s1">&#39;atomman_system_info&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">system_info</span>

    <span class="c1"># Write lammps input script</span>
    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">lammps_script</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">iprPy</span><span class="o">.</span><span class="n">tools</span><span class="o">.</span><span class="n">filltemplate</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">lammps_variables</span><span class="p">,</span>
                                         <span class="s1">&#39;&lt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&gt;&#39;</span><span class="p">))</span>

    <span class="c1"># Run lammps</span>
    <span class="n">output</span> <span class="o">=</span> <span class="n">lmp</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">lammps_command</span><span class="p">,</span> <span class="n">lammps_script</span><span class="p">,</span> <span class="n">mpi_command</span><span class="p">)</span>

    <span class="c1"># Extract lammps thermo data</span>
    <span class="n">thermo</span> <span class="o">=</span> <span class="n">output</span><span class="o">.</span><span class="n">simulations</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;thermo&#39;</span><span class="p">]</span>
    <span class="n">E_total_ptd</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">PotEng</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
                                  <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;energy&#39;</span><span class="p">])</span>
    <span class="n">pxx</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pxx</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pyy</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pyy</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pzz</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pzz</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pxy</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pxy</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pxz</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pxz</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pyz</span> <span class="o">=</span> <span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Pyz</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">lammps_units</span><span class="p">[</span><span class="s1">&#39;pressure&#39;</span><span class="p">])</span>
    <span class="n">pressure_ptd</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="n">pxx</span><span class="p">,</span> <span class="n">pxy</span><span class="p">,</span> <span class="n">pxz</span><span class="p">],</span> <span class="p">[</span><span class="n">pxy</span><span class="p">,</span> <span class="n">pyy</span><span class="p">,</span> <span class="n">pyz</span><span class="p">],</span> <span class="p">[</span><span class="n">pxz</span><span class="p">,</span> <span class="n">pyz</span><span class="p">,</span> <span class="n">pzz</span><span class="p">]])</span>

    <span class="c1"># Rename log file</span>
    <span class="n">shutil</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="s1">&#39;log.lammps&#39;</span><span class="p">,</span> <span class="s1">&#39;min-defect-log.lammps&#39;</span><span class="p">)</span>

    <span class="c1"># Load relaxed system from dump file and copy old vects as</span>
    <span class="c1"># the dump files crop the values</span>
    <span class="n">last_dump_file</span> <span class="o">=</span> <span class="s1">&#39;atom.&#39;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">thermo</span><span class="o">.</span><span class="n">Step</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    <span class="n">system_ptd</span> <span class="o">=</span> <span class="n">am</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s1">&#39;atom_dump&#39;</span><span class="p">,</span> <span class="n">last_dump_file</span><span class="p">,</span> <span class="n">symbols</span><span class="o">=</span><span class="n">system_ptd</span><span class="o">.</span><span class="n">symbols</span><span class="p">)</span>
    <span class="n">system_ptd</span><span class="o">.</span><span class="n">box_set</span><span class="p">(</span><span class="n">vects</span><span class="o">=</span><span class="n">system</span><span class="o">.</span><span class="n">box</span><span class="o">.</span><span class="n">vects</span><span class="p">)</span>
    <span class="n">system_ptd</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="s1">&#39;atom_dump&#39;</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="s1">&#39;defect.dump&#39;</span><span class="p">)</span>

    <span class="c1"># Compute defect formation energy</span>
    <span class="n">E_ptd_f</span> <span class="o">=</span> <span class="n">E_total_ptd</span> <span class="o">-</span> <span class="n">E_coh</span> <span class="o">*</span> <span class="n">system_ptd</span><span class="o">.</span><span class="n">natoms</span>

    <span class="c1"># Compute strain tensor</span>
    <span class="n">pij</span> <span class="o">=</span> <span class="o">-</span><span class="p">(</span><span class="n">pressure_base</span> <span class="o">-</span> <span class="n">pressure_ptd</span><span class="p">)</span> <span class="o">*</span> <span class="n">system_base</span><span class="o">.</span><span class="n">box</span><span class="o">.</span><span class="n">volume</span>

    <span class="c1"># Cleanup files</span>
    <span class="k">for</span> <span class="n">fname</span> <span class="ow">in</span> <span class="n">script_dir</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">&#39;atom.*&#39;</span><span class="p">):</span>
        <span class="n">fname</span><span class="o">.</span><span class="n">unlink</span><span class="p">()</span>
    <span class="k">for</span> <span class="n">dumpjsonfile</span> <span class="ow">in</span> <span class="n">script_dir</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">&#39;*.dump.json&#39;</span><span class="p">):</span>
        <span class="n">dumpjsonfile</span><span class="o">.</span><span class="n">unlink</span><span class="p">()</span>

    <span class="c1"># Return results</span>
    <span class="n">results_dict</span> <span class="o">=</span> <span class="p">{}</span>
    <span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;E_coh&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">E_coh</span>
    <span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;E_ptd_f&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">E_ptd_f</span>
    <span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;E_total_base&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">E_total_base</span>
    <span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;E_total_ptd&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">E_total_ptd</span>
    <span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;pij_tensor&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">pij</span>
    <span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;system_base&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">system_base</span>
    <span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;system_ptd&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">system_ptd</span>
    <span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;dumpfile_base&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;perfect.dump&#39;</span>
    <span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;dumpfile_ptd&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;defect.dump&#39;</span>

    <span class="k">return</span> <span class="n">results_dict</span>


</pre></div>
</div>
</div>
</div>
<div class="section" id="3.3.-check_ptd_config()">
<h4>3.3. check_ptd_config()<a class="headerlink" href="#3.3.-check_ptd_config()" title="Permalink to this headline">¶</a></h4>
<div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[11]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="k">def</span> <span class="nf">check_ptd_config</span><span class="p">(</span><span class="n">system</span><span class="p">,</span> <span class="n">point_kwargs</span><span class="p">,</span> <span class="n">cutoff</span><span class="p">,</span>
                     <span class="n">tol</span><span class="o">=</span><span class="n">uc</span><span class="o">.</span><span class="n">set_in_units</span><span class="p">(</span><span class="mf">1e-5</span><span class="p">,</span> <span class="s1">&#39;angstrom&#39;</span><span class="p">)):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Evaluates a relaxed system containing a point defect to determine if the</span>
<span class="sd">    defect structure has transformed to a different configuration.</span>

<span class="sd">    Parameters</span>
<span class="sd">    ----------</span>
<span class="sd">    system : atomman.System</span>
<span class="sd">        The relaxed defect system.</span>
<span class="sd">    point_kwargs : dict or list of dict</span>
<span class="sd">        One or more dictionaries containing the keyword arguments for</span>
<span class="sd">        the atomman.defect.point() function to generate specific point</span>
<span class="sd">        defect configuration(s).</span>
<span class="sd">    cutoff : float</span>
<span class="sd">        Cutoff distance to use in identifying neighbor atoms.</span>
<span class="sd">    tol : float, optional</span>
<span class="sd">        Absolute tolerance to use for identifying if a defect has</span>
<span class="sd">        reconfigured (default is 1e-5 Angstoms).</span>

<span class="sd">    Returns</span>
<span class="sd">    -------</span>
<span class="sd">    dict</span>
<span class="sd">        Dictionary of results consisting of keys:</span>

<span class="sd">        - **&#39;has_reconfigured&#39;** (*bool*) - Flag indicating if the structure</span>
<span class="sd">          has been identified as relaxing to a different defect configuration.</span>
<span class="sd">        - **&#39;centrosummation&#39;** (*numpy.array of float*) - The centrosummation</span>
<span class="sd">          parameter used for evaluating if the configuration has relaxed.</span>
<span class="sd">        - **&#39;position_shift&#39;** (*numpy.array of float*) - The position_shift</span>
<span class="sd">          parameter used for evaluating if the configuration has relaxed.</span>
<span class="sd">          Only given for interstitial and substitutional-style defects.</span>
<span class="sd">        - **&#39;db_vect_shift&#39;** (*numpy.array of float*) - The db_vect_shift</span>
<span class="sd">          parameter used for evaluating if the configuration has relaxed.</span>
<span class="sd">          Only given for dumbbell-style defects.</span>
<span class="sd">    &quot;&quot;&quot;</span>

    <span class="c1"># Check if point_kwargs is a list</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">point_kwargs</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
        <span class="n">pos</span> <span class="o">=</span> <span class="n">point_kwargs</span><span class="p">[</span><span class="s1">&#39;pos&#39;</span><span class="p">]</span>

    <span class="c1"># If it is a list of 1, use that set</span>
    <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">point_kwargs</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
        <span class="n">point_kwargs</span> <span class="o">=</span> <span class="n">point_kwargs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
        <span class="n">pos</span> <span class="o">=</span> <span class="n">point_kwargs</span><span class="p">[</span><span class="s1">&#39;pos&#39;</span><span class="p">]</span>

    <span class="c1"># If it is a list of two (divacancy), use the first and average position</span>
    <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">point_kwargs</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
        <span class="n">pos</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">point_kwargs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;pos&#39;</span><span class="p">])</span>
               <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">point_kwargs</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;pos&#39;</span><span class="p">]))</span> <span class="o">/</span> <span class="mi">2</span>
        <span class="n">point_kwargs</span> <span class="o">=</span> <span class="n">point_kwargs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>

    <span class="c1"># More than two not supported by this function</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Invalid point defect parameters&#39;</span><span class="p">)</span>

    <span class="c1"># Initially set has_reconfigured to False</span>
    <span class="n">has_reconfigured</span> <span class="o">=</span> <span class="kc">False</span>

    <span class="c1"># Calculate distance of all atoms from defect position</span>
    <span class="n">pos_vects</span> <span class="o">=</span> <span class="n">system</span><span class="o">.</span><span class="n">dvect</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">atoms</span><span class="o">.</span><span class="n">pos</span><span class="p">,</span> <span class="n">pos</span><span class="p">)</span>
    <span class="n">pos_mags</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">pos_vects</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>

    <span class="c1"># Calculate centrosummation by summing up the positions of the close atoms</span>
    <span class="n">centrosummation</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">pos_vects</span><span class="p">[</span><span class="n">pos_mags</span> <span class="o">&lt;</span> <span class="n">cutoff</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>

    <span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">allclose</span><span class="p">(</span><span class="n">centrosummation</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span> <span class="n">atol</span><span class="o">=</span><span class="n">tol</span><span class="p">):</span>
        <span class="n">has_reconfigured</span> <span class="o">=</span> <span class="kc">True</span>

    <span class="c1"># Calculate shift of defect atom&#39;s position if interstitial or substitutional</span>
    <span class="k">if</span> <span class="n">point_kwargs</span><span class="p">[</span><span class="s1">&#39;ptd_type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;i&#39;</span> <span class="ow">or</span> <span class="n">point_kwargs</span><span class="p">[</span><span class="s1">&#39;ptd_type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;s&#39;</span><span class="p">:</span>
        <span class="n">position_shift</span> <span class="o">=</span> <span class="n">system</span><span class="o">.</span><span class="n">dvect</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">natoms</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">pos</span><span class="p">)</span>

        <span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">allclose</span><span class="p">(</span><span class="n">position_shift</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span> <span class="n">atol</span><span class="o">=</span><span class="n">tol</span><span class="p">):</span>
            <span class="n">has_reconfigured</span> <span class="o">=</span> <span class="kc">True</span>

        <span class="k">return</span> <span class="p">{</span><span class="s1">&#39;has_reconfigured&#39;</span><span class="p">:</span> <span class="n">has_reconfigured</span><span class="p">,</span>
                <span class="s1">&#39;centrosummation&#39;</span><span class="p">:</span> <span class="n">centrosummation</span><span class="p">,</span>
                <span class="s1">&#39;position_shift&#39;</span><span class="p">:</span> <span class="n">position_shift</span><span class="p">}</span>

    <span class="c1"># Investigate if dumbbell vector has shifted direction</span>
    <span class="k">elif</span> <span class="n">point_kwargs</span><span class="p">[</span><span class="s1">&#39;ptd_type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;db&#39;</span><span class="p">:</span>
        <span class="n">db_vect</span> <span class="o">=</span> <span class="n">point_kwargs</span><span class="p">[</span><span class="s1">&#39;db_vect&#39;</span><span class="p">]</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">point_kwargs</span><span class="p">[</span><span class="s1">&#39;db_vect&#39;</span><span class="p">])</span>
        <span class="n">new_db_vect</span> <span class="o">=</span> <span class="n">system</span><span class="o">.</span><span class="n">dvect</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
        <span class="n">new_db_vect</span> <span class="o">=</span> <span class="n">new_db_vect</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">new_db_vect</span><span class="p">)</span>
        <span class="n">db_vect_shift</span> <span class="o">=</span> <span class="n">db_vect</span> <span class="o">-</span> <span class="n">new_db_vect</span>

        <span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">allclose</span><span class="p">(</span><span class="n">db_vect_shift</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span> <span class="n">atol</span><span class="o">=</span><span class="n">tol</span><span class="p">):</span>
            <span class="n">has_reconfigured</span> <span class="o">=</span> <span class="kc">True</span>

        <span class="k">return</span> <span class="p">{</span><span class="s1">&#39;has_reconfigured&#39;</span><span class="p">:</span> <span class="n">has_reconfigured</span><span class="p">,</span>
                <span class="s1">&#39;centrosummation&#39;</span><span class="p">:</span> <span class="n">centrosummation</span><span class="p">,</span>
                <span class="s1">&#39;db_vect_shift&#39;</span><span class="p">:</span> <span class="n">db_vect_shift</span><span class="p">}</span>

    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="p">{</span><span class="s1">&#39;has_reconfigured&#39;</span><span class="p">:</span> <span class="n">has_reconfigured</span><span class="p">,</span>
                <span class="s1">&#39;centrosummation&#39;</span><span class="p">:</span> <span class="n">centrosummation</span><span class="p">}</span>


</pre></div>
</div>
</div>
</div>
</div>
<div class="section" id="4.-Run-calculation-function(s)">
<h3>4. Run calculation function(s)<a class="headerlink" href="#4.-Run-calculation-function(s)" title="Permalink to this headline">¶</a></h3>
<div class="section" id="4.1.-Generate-point-defect-system-and-evaluate-the-energy">
<h4>4.1. Generate point defect system and evaluate the energy<a class="headerlink" href="#4.1.-Generate-point-defect-system-and-evaluate-the-energy" title="Permalink to this headline">¶</a></h4>
<div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[12]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">results_dict</span> <span class="o">=</span> <span class="n">pointdefect</span><span class="p">(</span><span class="n">lammps_command</span><span class="p">,</span> <span class="n">system</span><span class="p">,</span> <span class="n">potential</span><span class="p">,</span> <span class="n">point_kwargs</span><span class="p">,</span>
                           <span class="n">mpi_command</span> <span class="o">=</span> <span class="n">mpi_command</span><span class="p">,</span>
                           <span class="n">etol</span> <span class="o">=</span> <span class="n">energytolerance</span><span class="p">,</span>
                           <span class="n">ftol</span> <span class="o">=</span> <span class="n">forcetolerance</span><span class="p">,</span>
                           <span class="n">maxiter</span> <span class="o">=</span> <span class="n">maxiterations</span><span class="p">,</span>
                           <span class="n">maxeval</span> <span class="o">=</span> <span class="n">maxevaluations</span><span class="p">,</span>
                           <span class="n">dmax</span> <span class="o">=</span> <span class="n">maxatommotion</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[13]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">results_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
</pre></div>
</div>
</div>
<div class="nboutput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[13]:
</pre></div>
</div>
<div class="output_area docutils container">
<div class="highlight"><pre>
dict_keys([&#39;E_coh&#39;, &#39;E_ptd_f&#39;, &#39;E_total_base&#39;, &#39;E_total_ptd&#39;, &#39;pij_tensor&#39;, &#39;system_base&#39;, &#39;system_ptd&#39;, &#39;dumpfile_base&#39;, &#39;dumpfile_ptd&#39;])
</pre></div></div>
</div>
</div>
<div class="section" id="4.2.-Characterize-if-the-defect-has-reconfigured">
<h4>4.2. Characterize if the defect has reconfigured<a class="headerlink" href="#4.2.-Characterize-if-the-defect-has-reconfigured" title="Permalink to this headline">¶</a></h4>
<div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[14]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">cutoff</span> <span class="o">=</span> <span class="mf">1.05</span><span class="o">*</span><span class="n">ucell</span><span class="o">.</span><span class="n">box</span><span class="o">.</span><span class="n">a</span>
<span class="n">results_dict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">check_ptd_config</span><span class="p">(</span><span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;system_ptd&#39;</span><span class="p">],</span>
                                     <span class="n">point_kwargs</span><span class="p">,</span>
                                     <span class="n">cutoff</span><span class="p">))</span>
</pre></div>
</div>
</div>
<div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[15]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">results_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
</pre></div>
</div>
</div>
<div class="nboutput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[15]:
</pre></div>
</div>
<div class="output_area docutils container">
<div class="highlight"><pre>
dict_keys([&#39;E_coh&#39;, &#39;E_ptd_f&#39;, &#39;E_total_base&#39;, &#39;E_total_ptd&#39;, &#39;pij_tensor&#39;, &#39;system_base&#39;, &#39;system_ptd&#39;, &#39;dumpfile_base&#39;, &#39;dumpfile_ptd&#39;, &#39;has_reconfigured&#39;, &#39;centrosummation&#39;])
</pre></div></div>
</div>
</div>
</div>
<div class="section" id="5.-Report-results">
<h3>5. Report results<a class="headerlink" href="#5.-Report-results" title="Permalink to this headline">¶</a></h3>
<div class="section" id="5.1.-Define-units-for-outputting-values">
<h4>5.1. Define units for outputting values<a class="headerlink" href="#5.1.-Define-units-for-outputting-values" title="Permalink to this headline">¶</a></h4>
<ul class="simple">
<li><p><strong>length_unit</strong> is the unit of length to display relaxed lattice constants in.</p></li>
<li><p><strong>energy_unit</strong> is the unit of energy to display cohesive energies in.</p></li>
</ul>
<div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[16]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="n">length_unit</span> <span class="o">=</span> <span class="s1">&#39;angstrom&#39;</span>
<span class="n">energy_unit</span> <span class="o">=</span> <span class="s1">&#39;eV&#39;</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="5.2.-Print-E_{coh}-and-E_{ptd}^f">
<h4>5.2. Print <span class="math notranslate nohighlight">\(E_{coh}\)</span> and <span class="math notranslate nohighlight">\(E_{ptd}^f\)</span><a class="headerlink" href="#5.2.-Print-E_{coh}-and-E_{ptd}^f" title="Permalink to this headline">¶</a></h4>
<div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[17]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Ecoh =  &#39;</span><span class="p">,</span> <span class="n">uc</span><span class="o">.</span><span class="n">get_in_units</span><span class="p">(</span><span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;E_coh&#39;</span><span class="p">],</span> <span class="n">energy_unit</span><span class="p">),</span> <span class="n">energy_unit</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Eptd_f =&#39;</span><span class="p">,</span> <span class="n">uc</span><span class="o">.</span><span class="n">get_in_units</span><span class="p">(</span><span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;E_ptd_f&#39;</span><span class="p">],</span> <span class="n">energy_unit</span><span class="p">),</span> <span class="n">energy_unit</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="nboutput nblast docutils container">
<div class="prompt empty docutils container">
</div>
<div class="output_area docutils container">
<div class="highlight"><pre>
Ecoh =   -4.449999998346 eV
Eptd_f = 1.5999212636525046 eV
</pre></div></div>
</div>
</div>
<div class="section" id="5.3.-Check-configuration-parameters">
<h4>5.3. Check configuration parameters<a class="headerlink" href="#5.3.-Check-configuration-parameters" title="Permalink to this headline">¶</a></h4>
<div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[18]:
</pre></div>
</div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre>
<span></span><span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Has the system (likely) reconfigured?&#39;</span><span class="p">,</span> <span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;has_reconfigured&#39;</span><span class="p">])</span>
<span class="k">if</span> <span class="s1">&#39;centrosummation&#39;</span> <span class="ow">in</span> <span class="n">results_dict</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;centrosummation =&#39;</span><span class="p">,</span> <span class="n">uc</span><span class="o">.</span><span class="n">get_in_units</span><span class="p">(</span><span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;centrosummation&#39;</span><span class="p">],</span> <span class="n">length_unit</span><span class="p">),</span> <span class="n">length_unit</span><span class="p">)</span>
<span class="k">if</span> <span class="s1">&#39;position_shift&#39;</span> <span class="ow">in</span> <span class="n">results_dict</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;position_shift = &#39;</span><span class="p">,</span> <span class="n">uc</span><span class="o">.</span><span class="n">get_in_units</span><span class="p">(</span><span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;position_shift&#39;</span><span class="p">],</span> <span class="n">length_unit</span><span class="p">),</span> <span class="n">length_unit</span><span class="p">)</span>
<span class="k">if</span> <span class="s1">&#39;db_vect_shift&#39;</span> <span class="ow">in</span> <span class="n">results_dict</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;db_vect_shift =  &#39;</span><span class="p">,</span> <span class="n">uc</span><span class="o">.</span><span class="n">get_in_units</span><span class="p">(</span><span class="n">results_dict</span><span class="p">[</span><span class="s1">&#39;db_vect_shift&#39;</span><span class="p">],</span> <span class="n">length_unit</span><span class="p">),</span> <span class="n">length_unit</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="nboutput nblast docutils container">
<div class="prompt empty docutils container">
</div>
<div class="output_area docutils container">
<div class="highlight"><pre>
Has the system (likely) reconfigured? False
centrosummation = [-1.89367102e-12 -1.89381844e-12 -1.89359639e-12] angstrom
</pre></div></div>
</div>
</div>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">
  <h3><a href="../index.html">Table of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">point_defect_static calculation style</a><ul>
<li><a class="reference internal" href="#Introduction">Introduction</a><ul>
<li><a class="reference internal" href="#Version-notes">Version notes</a></li>
<li><a class="reference internal" href="#Additional-dependencies">Additional dependencies</a></li>
<li><a class="reference internal" href="#Disclaimers">Disclaimers</a></li>
</ul>
</li>
<li><a class="reference internal" href="#Method-and-Theory">Method and Theory</a></li>
<li><a class="reference internal" href="#Demonstration">Demonstration</a><ul>
<li><a class="reference internal" href="#1.-Setup">1. Setup</a><ul>
<li><a class="reference internal" href="#1.1.-Library-imports">1.1. Library imports</a></li>
<li><a class="reference internal" href="#1.2.-Default-calculation-setup">1.2. Default calculation setup</a></li>
</ul>
</li>
<li><a class="reference internal" href="#2.-Assign-values-for-the-calculation’s-run-parameters">2. Assign values for the calculation’s run parameters</a><ul>
<li><a class="reference internal" href="#2.1.-Specify-system-specific-paths">2.1. Specify system-specific paths</a></li>
<li><a class="reference internal" href="#2.2.-Load-interatomic-potential">2.2. Load interatomic potential</a></li>
<li><a class="reference internal" href="#2.3.-Load-initial-unit-cell-system">2.3. Load initial unit cell system</a></li>
<li><a class="reference internal" href="#2.4.-Specify-the-defect-parameters">2.4. Specify the defect parameters</a></li>
<li><a class="reference internal" href="#2.5.-Modify-system">2.5. Modify system</a></li>
<li><a class="reference internal" href="#2.6.-Specify-calculation-specific-run-parameters">2.6. Specify calculation-specific run parameters</a></li>
</ul>
</li>
<li><a class="reference internal" href="#3.-Define-calculation-function(s)-and-generate-template-LAMMPS-script(s)">3. Define calculation function(s) and generate template LAMMPS script(s)</a><ul>
<li><a class="reference internal" href="#3.1.-min.template">3.1. min.template</a></li>
<li><a class="reference internal" href="#3.2.-pointdefect()">3.2. pointdefect()</a></li>
<li><a class="reference internal" href="#3.3.-check_ptd_config()">3.3. check_ptd_config()</a></li>
</ul>
</li>
<li><a class="reference internal" href="#4.-Run-calculation-function(s)">4. Run calculation function(s)</a><ul>
<li><a class="reference internal" href="#4.1.-Generate-point-defect-system-and-evaluate-the-energy">4.1. Generate point defect system and evaluate the energy</a></li>
<li><a class="reference internal" href="#4.2.-Characterize-if-the-defect-has-reconfigured">4.2. Characterize if the defect has reconfigured</a></li>
</ul>
</li>
<li><a class="reference internal" href="#5.-Report-results">5. Report results</a><ul>
<li><a class="reference internal" href="#5.1.-Define-units-for-outputting-values">5.1. Define units for outputting values</a></li>
<li><a class="reference internal" href="#5.2.-Print-E_{coh}-and-E_{ptd}^f">5.2. Print <span class="math notranslate nohighlight">\(E_{coh}\)</span> and <span class="math notranslate nohighlight">\(E_{ptd}^f\)</span></a></li>
<li><a class="reference internal" href="#5.3.-Check-configuration-parameters">5.3. Check configuration parameters</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>

  <h4>Previous topic</h4>
  <p class="topless"><a href="point_defect_diffusion.html"
                        title="previous chapter">point_defect_diffusion calculation style</a></p>
  <h4>Next topic</h4>
  <p class="topless"><a href="relax_box.html"
                        title="next chapter">relax_box calculation style</a></p>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="right" >
          <a href="relax_box.html" title="relax_box calculation style"
             >next</a> |</li>
        <li class="right" >
          <a href="point_defect_diffusion.html" title="point_defect_diffusion calculation style"
             >previous</a> |</li>
        <li class="nav-item nav-item-0"><a href="../index.html">iprPy 0.10.2 documentation</a> &#187;</li>
          <li class="nav-item nav-item-1"><a href="../notebook_styles.html" >Jupyter Demonstration Notebooks</a> &#187;</li> 
      </ul>
    </div>
    <div class="footer" role="contentinfo">
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 2.1.2.
    </div>
  </body>
</html>